﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLEndereco : BLBase
    {

        // Representa o objeto de acesso a dados
        private DAEndereco da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLEndereco()
            : base("DEFAULT")
        {
            da = new DAEndereco("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLEndereco(string tenantId)
            : base(tenantId)
        {
            da = new DAEndereco(tenantId);  
        }

        /// <summary>
        /// Consulta endereços (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdGuid">Identificador do proprietário</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de endereços</returns>
        public List<ENDERECO> consultarEnderecos(string cdGuid, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<ENDERECO> retorno = null;

            try
            {
                retorno = this.da.consultarEnderecos(cdGuid, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta endereços (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdGuid">Identificador do proprietário</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarEnderecosCount(string cdGuid)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarEnderecosCount(cdGuid);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um endereço
        /// </summary>
        /// <param name="cdGuid">Identificador do proprietário</param>
        /// <param name="nrOrdem">Nº de ordem</param>
        /// <returns>Lista contendo um endereço</returns>
        public List<ENDERECO> listarEndereco(Guid cdGuid, int nrOrdem)
        {
            List<ENDERECO> retorno = null;

            try
            {
                retorno = this.da.listarEndereco(cdGuid, nrOrdem);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos básicos - CRUD

        /// <summary>
        /// Insere um endereço
        /// </summary>
        /// <param name="entity">Entidade endereço</param>
        public void inserirEndereco(ENDERECO entity)
        {
            try
            {
                this.da.inserirEndereco(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Atualiza os dados do endereço
        /// </summary>
        /// <param name="entity">Entidade endereço</param>
        public void atualizarEndereco(ENDERECO entity)
        {
            try
            {
                this.da.atualizarEndereco(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um endereço
        /// </summary>
        /// <param name="entity">Entidade endereço</param>
        public void excluirEndereco(ENDERECO entity)
        {
            try
            {
                this.da.excluirEndereco(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }
}
